package com.nowcoder.topic.string.middle;

import java.math.BigInteger;

/**
 * NC381 累加序列
 * @author d3y1
 */
public class NC381{
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param arr string字符串
     * @return bool布尔型
     */
    public boolean AdditiveArray (String arr) {
        int len = arr.length();

        // 开始状态
        int max;
        for(int i=1; i<len; i++){
            for(int j=i+1; j<len; j++){
                max = Math.max(i, j-i);
                if((j+max<=len&&isAdditive(arr, 0, i, j, j+max)) || (j+max+1<=len&&isAdditive(arr, 0, i, j, j+max+1))){
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * dfs: 递归
     * @param arr
     * @param start
     * @param left
     * @param right
     * @param end
     * @return
     */
    private boolean isAdditive(String arr, int start, int left, int right, int end){
        // 前导0
        String firstStr = arr.substring(start, left);
        if(firstStr.length()>1 && firstStr.startsWith("0")){
            return false;
        }
        // 前导0
        String secondStr = arr.substring(left, right);
        if(secondStr.length()>1 && secondStr.startsWith("0")){
            return false;
        }
        // 前导0
        String sumStr = arr.substring(right, end);
        if(sumStr.length()>1 && sumStr.startsWith("0")){
            return false;
        }

        BigInteger first = new BigInteger(firstStr);
        BigInteger second = new BigInteger(secondStr);
        // 是否相等
        if(first.add(second).toString().equals(sumStr)){
            // 遍历完成
            if(end == arr.length()){
                return true;
            }else{
                // 递归遍历
                int max = Math.max(right-left, end-right);
                if((end+max<=arr.length()&&isAdditive(arr, left, right, end, end+max)) || (end+max+1<=arr.length()&&isAdditive(arr, left, right, end, end+max+1))){
                    return true;
                }
            }
        }

        return false;
    }
}